//package com.hsjk.szwj.module.pay.controller.app.transfer;
//
//import cn.hutool.core.util.IdUtil;
//import com.hsjk.szwj.framework.common.exception.ServiceException;
//import com.hsjk.szwj.framework.common.exception.enums.GlobalErrorCodeConstants;
//import com.hsjk.szwj.framework.common.util.spring.SpringBeansUtil;
//import com.hsjk.szwj.framework.common.util.string.StringKit;
//import com.hsjk.szwj.module.pay.controller.PayApiController;
//import com.hsjk.szwj.module.pay.controller.app.transfer.vo.TransferOrderReqVO;
//import com.hsjk.szwj.module.pay.controller.app.transfer.vo.TransferOrderRespVO;
//import com.hsjk.szwj.module.pay.dal.dataobject.CommonPayResult;
//import com.hsjk.szwj.module.pay.dal.dataobject.config.ChannelRetMsg;
//import com.hsjk.szwj.module.pay.dal.dataobject.config.MchAppConfigContext;
//import com.hsjk.szwj.module.pay.dal.dataobject.order.TransferOrderDO;
//import com.hsjk.szwj.module.pay.dal.dataobject.system.MchAppDO;
//import com.hsjk.szwj.module.pay.dal.dataobject.system.MchInfoDO;
//import com.hsjk.szwj.module.pay.exception.ChannelException;
//import com.hsjk.szwj.module.pay.service.ConfigContextQueryService;
//import com.hsjk.szwj.module.pay.service.ITransferService;
//import com.hsjk.szwj.module.pay.service.PayInterfaceConfigService;
//import com.hsjk.szwj.module.pay.service.PayInterfaceDefineService;
//import com.hsjk.szwj.module.pay.service.PayMchNotifyService;
//import com.hsjk.szwj.module.pay.service.TransferOrderService;
//import io.swagger.v3.oas.annotations.tags.Tag;
//import lombok.extern.slf4j.Slf4j;
//import org.apache.commons.lang3.StringUtils;
//import org.springframework.validation.annotation.Validated;
//import org.springframework.web.bind.annotation.PostMapping;
//import org.springframework.web.bind.annotation.RequestMapping;
//import org.springframework.web.bind.annotation.RestController;
//
//import javax.annotation.Resource;
//import java.time.LocalDateTime;
//
///**
// * @author chenjiawei
// * @desc 转账接口
// * @Date 2023/08/26 15:06
// **/
//@Tag(name = "应用端 - 转账相关接口")
//@RestController
//@RequestMapping("/transfer")
//@Validated
//@Slf4j
//public class TransferOrderController extends PayApiController {
//    @Resource
//    private ConfigContextQueryService configContextQueryService;
//    @Resource
//    private TransferOrderService transferOrderService;
//    @Resource
//    private PayInterfaceConfigService payInterfaceConfigService;
//    @Resource
//    private PayMchNotifyService payMchNotifyService;
//
//    @Resource
//    private PayInterfaceDefineService payInterfaceDefineService;
//
//    /**
//     * 转账
//     **/
//    @PostMapping("/transferOrder")
//    public CommonPayResult transferOrder() {
//
//        TransferOrderDO transferOrder = null;
//
//        //获取参数 & 验签
//        TransferOrderReqVO bizRQ = getRQByWithMchSign(TransferOrderReqVO.class);
//
//        try {
//
//
//            Long mchId = bizRQ.getMchId();
//            Long appId = bizRQ.getAppId();
//            String ifCode = bizRQ.getIfCode();
//            Long ifId = payInterfaceDefineService.getIdByCode(ifCode);
//
//            // 商户订单号是否重复
////            if (transferOrderService.count(new LambdaQueryWrapper<TransferOrderDO>()
////                    .eq(TransferOrderDO::getMchId, mchId)
////                    .eq(TransferOrderDO::getMchOrderId, bizRQ.getMchOrderId())) > 0) {
////                throw new ServiceException(GlobalErrorCodeConstants.BAD_REQUEST.getCode(),
////                        "商户订单[" + bizRQ.getMchOrderId() + "]已存在");
////            }
//
//            if (StringUtils.isNotEmpty(bizRQ.getNotifyUrl())
//                    && !StringKit.isAvailableUrl(bizRQ.getNotifyUrl())) {
//                throw new ServiceException(GlobalErrorCodeConstants.BAD_REQUEST.getCode(),
//                        "异步通知地址协议仅支持http:// 或 https:// !");
//            }
//
//            // 商户配置信息
//            MchAppConfigContext mchAppConfigContext
//                    = configContextQueryService.queryMchInfoAndAppInfo(mchId, appId);
//            if (mchAppConfigContext == null) {
//                throw new ServiceException(GlobalErrorCodeConstants.BAD_REQUEST.getCode(),
//                        "获取商户应用信息失败");
//            }
//
//            MchInfoDO mchInfo = mchAppConfigContext.getMchInfo();
//            MchAppDO mchApp = mchAppConfigContext.getMchApp();
//
//            // 是否已正确配置
//            if (!payInterfaceConfigService.mchAppHasAvailableIfCode(appId, ifId)) {
//                throw new ServiceException(GlobalErrorCodeConstants.BAD_REQUEST.getCode(),
//                        "应用未开通此接口配置!");
//            }
//
//
//            ITransferService transferService
//                    = SpringBeansUtil.getBean(ifCode + "TransferService",
//                    ITransferService.class);
//            if (transferService == null) {
//                throw new ServiceException(GlobalErrorCodeConstants.BAD_REQUEST.getCode(),
//                        "无此转账通道接口");
//            }
//
//            if (!transferService.isSupport(bizRQ.getEntryType())) {
//                throw new ServiceException(GlobalErrorCodeConstants.BAD_REQUEST.getCode(),
//                        "该接口不支持该入账方式");
//            }
//
//            transferOrder = genTransferOrder(bizRQ, mchInfo, mchApp, ifId);
//
//            //预先校验
//            String errMsg = transferService.preCheck(bizRQ, transferOrder);
//            if (StringUtils.isNotEmpty(errMsg)) {
//                throw new ServiceException(GlobalErrorCodeConstants.BAD_REQUEST.getCode(),
//                        errMsg);
//            }
//
//            // 入库
//            transferOrderService.save(transferOrder);
//
//            // 调起上游接口
//            ChannelRetMsg channelRetMsg = transferService.transfer(bizRQ, transferOrder, mchAppConfigContext);
//
//            //处理退款单状态
//            this.processChannelMsg(channelRetMsg, transferOrder);
//
//            TransferOrderRespVO bizRes = TransferOrderRespVO.buildByRecord(transferOrder);
//            return CommonPayResult.okWithSign(bizRes, mchApp.getAppSecret());
//
//        } catch (ServiceException e) {
//            return CommonPayResult.error(e.getMessage());
//
//        } catch (ChannelException e) {
//
//            //处理上游返回数据
//            this.processChannelMsg(e.getChannelRetMsg(), transferOrder);
//
//            if (e.getChannelRetMsg().getChannelState() == ChannelRetMsg.ChannelState.SYS_ERROR) {
//                return CommonPayResult.error(e.getMessage());
//            }
//
//            TransferOrderRespVO bizRes = TransferOrderRespVO.buildByRecord(transferOrder);
//            return CommonPayResult.okWithSign(bizRes,
//                    configContextQueryService.queryMchApp(bizRQ.getMchId(),
//                            bizRQ.getAppId()).getAppSecret());
//
//        } catch (Exception e) {
//            log.error("系统异常：{}", e);
//            return CommonPayResult.error("系统异常");
//        }
//    }
//
//
//    private TransferOrderDO genTransferOrder(TransferOrderReqVO rq,
//                                             MchInfoDO mchInfo, MchAppDO mchApp,
//                                             Long ifId) {
//
//        TransferOrderDO transferOrder = new TransferOrderDO();
//        //商户号
//        transferOrder.setMchId(mchInfo.getId());
//        //服务商号
//        transferOrder.setIsvId(mchInfo.getIsvId());
//        //商户应用appId
//        transferOrder.setAppId(mchApp.getId());
//        //商户名称（简称）
//        transferOrder.setMchName(mchInfo.getMchShortName());
//        //商户类型
//        transferOrder.setMchType(mchInfo.getMchType());
//        //商户订单号
//        long orderId = IdUtil.getSnowflakeNextId();
//        transferOrder.setMchOrderId(orderId);
//        //接口代码
//        transferOrder.setIfId(ifId);
//        //入账方式
//        transferOrder.setEntryType(rq.getEntryType());
//        //订单金额
//        transferOrder.setAmount(rq.getAmount());
//        //币种
//        transferOrder.setCurrency(rq.getCurrency());
//        //客户端IP
//        transferOrder.setClientIp(StringUtils.defaultIfEmpty(rq.getClientIp(),
//                getClientIp()));
//        //订单状态, 默认订单生成状态
//        transferOrder.setState(TransferOrderDO.STATE_INIT);
//        //收款账号
//        transferOrder.setAccountNo(rq.getAccountNo());
//        //账户姓名
//        transferOrder.setAccountName(rq.getAccountName());
//        //银行名称
//        transferOrder.setBankName(rq.getBankName());
//        //转账备注
//        transferOrder.setTransferDesc(rq.getTransferDesc());
//        //商户扩展参数
//        transferOrder.setExtParam(rq.getExtParam());
//        //异步通知地址
//        transferOrder.setNotifyUrl(rq.getNotifyUrl());
//        //订单创建时间
//        transferOrder.setCreateTime(LocalDateTime.now());
//        return transferOrder;
//
//    }
//
//
//    /**
//     * 处理返回的渠道信息，并更新订单状态
//     * TransferOrder将对部分信息进行 赋值操作。
//     **/
//    private void processChannelMsg(ChannelRetMsg channelRetMsg,
//                                   TransferOrderDO transferOrder) {
//
//        //对象为空 || 上游返回状态为空， 则无需操作
//        if (channelRetMsg == null || channelRetMsg.getChannelState() == null) {
//            return;
//        }
//
//        Long transferId = transferOrder.getId();
//
//        //明确成功
//        if (ChannelRetMsg.ChannelState.CONFIRM_SUCCESS == channelRetMsg.getChannelState()) {
//
//            this.updateInitOrderStateThrowException(TransferOrderDO.STATE_SUCCESS,
//                    transferOrder, channelRetMsg);
//            payMchNotifyService.transferOrderNotify(transferOrder);
//
//            //明确失败
//        } else if (ChannelRetMsg.ChannelState.CONFIRM_FAIL
//                == channelRetMsg.getChannelState()) {
//
//            this.updateInitOrderStateThrowException(TransferOrderDO.STATE_FAIL,
//                    transferOrder, channelRetMsg);
//            payMchNotifyService.transferOrderNotify(transferOrder);
//
//            // 上游处理中 || 未知 || 上游接口返回异常  订单为支付中状态
//        } else if (ChannelRetMsg.ChannelState.WAITING == channelRetMsg.getChannelState() ||
//                ChannelRetMsg.ChannelState.UNKNOWN == channelRetMsg.getChannelState() ||
//                ChannelRetMsg.ChannelState.API_RET_ERROR == channelRetMsg.getChannelState()
//
//        ) {
//            this.updateInitOrderStateThrowException(TransferOrderDO.STATE_ING,
//                    transferOrder, channelRetMsg);
//
//            // 系统异常：  订单不再处理。  为： 生成状态
//        } else if (ChannelRetMsg.ChannelState.SYS_ERROR == channelRetMsg.getChannelState()) {
//
//        } else {
//
//            throw new ServiceException(GlobalErrorCodeConstants.BAD_REQUEST.getCode(),
//                    "ChannelState 返回异常！");
//        }
//
//    }
//
//
//    /**
//     * 更新订单状态 --》 订单生成--》 其他状态  (向外抛出异常)
//     **/
//    private void updateInitOrderStateThrowException(Integer orderState,
//                                                    TransferOrderDO transferOrder,
//                                                    ChannelRetMsg channelRetMsg) {
//
//        transferOrder.setState(orderState);
//        transferOrder.setChannelOrderNo(channelRetMsg.getChannelOrderId());
//        transferOrder.setErrCode(channelRetMsg.getChannelErrCode());
//        transferOrder.setErrMsg(channelRetMsg.getChannelErrMsg());
//
//
//        boolean isSuccess =
//                transferOrderService.updateInit2Ing(transferOrder.getId());
//        if (!isSuccess) {
//            throw new ServiceException(GlobalErrorCodeConstants.BAD_REQUEST.getCode(),
//                    "更新转账订单异常!");
//        }
//
//        isSuccess =
//                transferOrderService.updateIng2SuccessOrFail(transferOrder.getId(),
//                        transferOrder.getState(),
//                        channelRetMsg.getChannelOrderId(),
//                        channelRetMsg.getChannelErrCode(),
//                        channelRetMsg.getChannelErrMsg());
//        if (!isSuccess) {
//            throw new ServiceException(GlobalErrorCodeConstants.BAD_REQUEST.getCode(),
//                    "更新转账订单异常!");
//        }
//    }
//}
